#include <iostream>
#include <unistd.h>
#include <string.h>
#include <cassert>
// int main(){
//     int pipefd[2]={0};
//     //1.创建管道
//     int n = pipe(pipefd);
//     if(n<0){
//         std::cout<<"pipe error"<<errno<<strerror(errno)<<std::endl;
//     }
//     //2.创建子进程
//     pid_t id = fork();
//     assert(id!=-1);
//     if(id==0){
//         //3. 关闭不需要的fd,让父进程只读，子进程只写
//         close(pipefd[0]);

//         //4.开始通信 
//         const std::string namestr = "hello , i am child";
//         int cnt = 1;
//         char buffer[1024];
//         while(true){
//             snprintf(buffer,sizeof(buffer),"%s %d mypid:%d\n",namestr.c_str(),cnt++,getpid());
//             write(pipefd[1],buffer,strlen(buffer));
//             sleep(1);
//         }
//     }
//     //3. 关闭不需要的fd,让父进程只读，子进程只写
//     close(pipefd[1]);

//     //4. 开始通信
//     char buffer[1024];
//     while(true){
//         int n = read(pipefd[0],buffer,sizeof(buffer)-1);
//         if(n>0){
//             buffer[n]='\0';
//             std::cout<<"I am father process: i receive signal"<<buffer<<std::endl;
//         }
//     }
//     return 0;
// }
using namespace std;
int main(){
    //创建管道
    int pipefd[2]={0};
    int n = pipe(pipefd);
    if(n<0){
        perror("create pipe fail");
    }
    //创建子进程
    pid_t fd = fork();
    if(fd==0){
        //关闭不需要的文件操作符,子进程只读
        close(pipefd[1]);
        dup2(pipefd[0],0);
        char buffer[1024];
        while(true){
            size_t n = read(pipefd[0],buffer,sizeof(buffer)-1);
            if(n>0){
                buffer[n]='\0';
                cout<<buffer<<endl;
            }
            sleep(1);
        }
        exit(0);
    }
    //父进程
    //关闭不需要的文件操作符,父进程只写
    close(pipefd[0]);
    char buff[]="I am father";
    assert(n != -1);
    (void)n;
    while(true){
        size_t n = write(pipefd[1],buff,sizeof(buff)-1);
        sleep(1);
    }
    
    return 0;
}